#include <iostream>
#include <iomanip>
#include <string>
#include <memory>
#include <chrono>   // 用于 std::this_thread::sleep_for
#include <thread>   // 用于 std::this_thread::sleep_for
#include "xdgTcpServer.hpp" // TCP服务器头文件
#include "xdgThreadPool.hpp" // 线程池头文件

xdg::ThreadPool pool; // 全局线程池实例
void onError(const std::string& errMsg); // 错误回调函数前向声明

// ======================= 回调函数实现 =======================

// 具体处理数据的函数（在线程池中运行）
void handleMessage(std::shared_ptr<xdg::TcpContext> context, std::shared_ptr< std::vector<char> > pack)
{

    std::cout << "[->]  收到数据包：" << pack->size() << " bytes from[" << context->clientIp() << "]: ";

    for (size_t i = 0; i < pack->size(); ++i) {
        printf("%02X ", pack->data()[i]);
    }

    std::cout << std::endl << "      内容：";
    // 将接收到的数据当作字符串打印出来
    std::cout.write(pack->data(), pack->size());
    std::cout << std::endl;

    // Echo back: 将收到的数据原样发回给客户端
    std::cout << "[<-] 回显数据包：" << pack->size() << " bytes." << std::endl;
    try{
        context->send(pack->data(), pack->size());
    }catch (const std::exception& e) {
        std::string str = "handleMessage：";
        str = str + e.what();
        onError(str);
    }
    
}


// 新客户端连接回调
int onConnection(std::shared_ptr<xdg::TcpContext> context)
{
    std::cout << "[+] 新用户连接: " << context->clientIp() << ":" << context->clientPort() << std::endl;
    return 0; // 返回0表示接受连接
}



// 数据到达（完整数据包）回调
void onMessage(std::shared_ptr<xdg::TcpContext> context, const char* data, size_t len)
{
    std::shared_ptr< std::vector<char> > pack = std::make_shared< std::vector<char> >(data, data + len);
    try{
        pool.submit(handleMessage, context, pack);
    }catch (const std::exception& e) {
        std::string str = "handleMessage：";
        str = str + e.what();
        onError(str);
    }

    return;
}

// 客户端断开连接回调
void onClose(std::shared_ptr<xdg::TcpContext> context)
{
    std::cout << "[-] 客户端断开连接: " << context->clientIp() << std::endl;
}

// 服务器错误回调
void onError(const std::string& errMsg)
{
    std::cerr << "[!] Server Error: " << errMsg << std::endl;
}


// ======================= 主函数 =======================

int main()
{
    const std::string SERVER_IP = "0.0.0.0"; // 监听所有网络接口
    const int SERVER_PORT = 8080;

    std::cout << "--- TCP Echo Server ---" << std::endl;

    // 1. 创建服务器实例
    xdg::TcpServer server(SERVER_IP, SERVER_PORT);
    pool.start(); // 启动线程池

    // 2. 设置拆包规则（固定12字节）
    server.setUnpackingRule(xdg::UnpackingRule::FIXED_LENGTH, 12);

    // 3. 绑定回调函数
    server.setClientConnectCallback(onConnection); // 新客户端连接回调
    server.setDataArrivedCallback(onMessage); // 数据到达（完整数据包）回调
    server.setClientDisconnectCallback(onClose); // 客户端断开连接回调
    server.setErrorCallback(onError); // 服务器错误回调

    // 4. 启动服务器
    if (server.start() != 0) {
        std::cerr << "Failed to start server." << std::endl;
        return 1;
    }

    std::cout << "[OK] TCP 回显服务器启动成功，监听端口：" << SERVER_IP << ":" << SERVER_PORT << std::endl;
    std::cout << "输入 'q' 或 'quit' 或 '回车' 后按回车键来停止服务器..." << std::endl;

    // 5. 主线程阻塞，等待用户输入 "quit"
    std::string cmd;
    while (std::getline(std::cin, cmd)) {
        if (cmd == "q" || cmd == "quit" || cmd.empty()) {
            break;
        }
    }

    // 6. 停止服务器
    std::cout << "正在停止服务器..." << std::endl;
    server.stop();
    std::cout << "[OK] 服务器已停止." << std::endl;

    pool.destroy(); // 停止线程池

    return 0;
}
